Перейти к основному содержимому

🧩 Патчи, исходники и версии

🎯 Цель раздела

После изучения этого раздела вы:

  • научитесь работать с исходным кодом пакета;
  • поймёте, как создавать и применять патчи;
  • освоите правила обновления версии и релиза;
  • узнаете, как поддерживать пакет в актуальном состоянии.

📦 Исходники и их хранение

Исходники пакета (обычно .tar.gz или .tar.xz) лежат в директории:


~/rpmbuild/SOURCES/

Они загружаются в Automated Build Farm (ABF) вместе с .spec и патчами. При сборке rpmbuild автоматически распаковывает указанный архив в секции %prep:

Source0: hello-1.0.tar.gz

Проверка исходников

Чтобы убедиться, что исходники корректны:

tar tzf ~/rpmbuild/SOURCES/hello-1.0.tar.gz

🧵 Что такое патч

Патч (diff) — это файл, описывающий изменения в исходном коде. Он создаётся командой diff и применяется в секции %prep.

Пример:

diff -u old/hello.c new/hello.c > hello-fix-greeting.patch

Содержимое:

--- old/hello.c
+++ new/hello.c
@@ -1,5 +1,5 @@
#include <stdio.h>
int main() {
- printf("Hello, ROSA!\n");
+ printf("Hello, World from ROSA Linux!\n");
return 0;
}

🧱 Применение патча в SPEC-файле

Добавьте патч в заголовок SPEC:

Patch0: hello-fix-greeting.patch

А затем примените его в секции %prep:

%prep
%setup -q
%patch0 -p1

💡 Флаг -p1 указывает, сколько уровней каталогов нужно отбросить при применении патча. Обычно используется -p1.


🧰 Проверка патча вручную

Перед сборкой можно проверить, применится ли патч корректно:

cd ~/rpmbuild/BUILD/hello-1.0
patch -p1 < ~/rpmbuild/SOURCES/hello-fix-greeting.patch

Если вывод содержит patching file ... без ошибок — всё хорошо.


🔄 Обновление версии и релиза

При обновлении версии программы:

  1. Измените Version: в SPEC-файле;
  2. Обновите архив в SOURCES;
  3. Обновите запись в %changelog.

Пример:

Version: 1.1
Release: 1%{?dist}

%changelog
* Thu Oct 30 2025 Sergey Braumann <sergeybraumann@gmail.com> 1.1-1
- Updated to upstream version 1.1

⚠️ Release увеличивается при каждом изменении SPEC или патчей, а Version — только при обновлении исходного ПО.


🧩 Пример: исправляем ошибку в пакете

Допустим, в hello.c опечатка — напечатано Helloo.

1. Измените код

tar xf hello-1.0.tar.gz
cd hello-1.0
sed -i 's/Helloo/Hello/g' hello.c

2. Создайте патч

diff -u ../hello-1.0.orig/hello.c hello.c > ../hello-fix-typo.patch

3. Добавьте патч в SPEC

Patch1: hello-fix-typo.patch
...
%patch1 -p1

4. Соберите заново

rpmbuild -ba SPECS/hello.spec

🧱 Поддержка нескольких патчей

Порядок важен — патчи применяются в том порядке, как они перечислены в SPEC.

Patch0: fix-path.patch
Patch1: fix-typo.patch
Patch2: remove-debug.patch
%prep
%setup -q
%patch0 -p1
%patch1 -p1
%patch2 -p1

📘 Рекомендуется именовать патчи осмысленно, например: fix-crash-gtk.patch, add-systemd-service.patch, update-license.patch.


🧩 Пример типового обновления версии

Было:

Version: 1.0
Release: 2%{?dist}
Source0: hello-1.0.tar.gz

Стало:

Version: 1.1
Release: 1%{?dist}
Source0: hello-1.1.tar.gz

Проверяем, что новый архив совпадает:

ls ~/rpmbuild/SOURCES/hello-1.1.tar.gz

🧠 Мини-тест для самопроверки

ВопросОтвет
Что делает %patch0 -p1?Применяет первый патч к исходникам
Где хранятся исходники пакета?В ~/rpmbuild/SOURCES/
Когда нужно увеличивать Release?При изменении SPEC или патчей
Как создаётся патч?diff -u старый новый > файл.patch
Зачем патчи в ABF?Для адаптации исходников под ROSA без изменения апстрима

🧭 Итого

Теперь вы:

  • умеете создавать и применять патчи;
  • понимаете структуру и назначение секции %prep;
  • знаете, как обновлять версии и релизы;
  • готовы к следующему шагу — управлению зависимостями и оптимизацией SPEC-файла.

Следующий документ — “Зависимости и улучшение SPEC” — покажет, как описывать зависимости, управлять скриптами установки и писать “чистый” SPEC-файл.